package licode.unisop.provider.api;

import licode.unisop.provider.info.*;

import java.util.Map;

/**
 * Oauth2授权实现
 *
 * 授权码模式的步骤如下：
 *
 * 1）请求oauth/authorize获取code
 * 2）认证通过之后，重定向到redirect_uri，code的值在地址上
 * 3）获取到code，请求/oauth/token，grant_type=authorization_code
 * 4）认证通过之后，获取到token信息

 * @author licode
 */
public interface SiOauthProvider {
    /**
     * 根据认证上下文信息生成用授权票据
     * @param context 认证相关信息
     * @return 授权票据
     */
    SiCodeInfo buildCode(SiAuthContextIn context);
    SiCodeInfo autoSso(SiAuthContextIn auth);

    /**
     * 根据登录认证信息返回凭证
     * @param idInfo 认证信息
     * @return 登录凭证
     */
    Map<String, Object> getCredential(TokenIdInfo idInfo);

    /**
     * 通过授权票据生成登录凭证
     * @param codeInfo 授权票据码
     * @return 用户认证凭证
     */
    Map<String, Object> buildCredential(SiAuthCode codeInfo);

    /**
     * 根据认证上下文信息生成用户认证凭证
     * @param context 认证相关信息
     * @return 用户认证凭证
     */
    Map<String, Object> buildCredential(SiAuthContextIn context);

    /**
     * 退出整个用户的登录
     * @param idInfo 用户ID信息
     */
    void logoutByUserId(UserIdInfo idInfo);

    /**
     * 退出登录
     * @param idInfo 访问令牌
     */
    void logoutByAccessToken(TokenIdInfo idInfo);

    /**
     * 根据登录令牌退出单点登录
     * @param idInfo 访问令牌
     */
    void logoutBySso(TokenIdInfo idInfo);

    /**
     * 根据登录令牌退出整个会话
     * @param idInfo 访问令牌
     */
    void logoutBySession(TokenIdInfo idInfo);

    /**
     * 刷新当前登录，更新时间
     * @param idInfo 刷新令牌
     * @return 用户凭证信息
     */
    Map<String, Object> refresh(TokenIdInfo idInfo, boolean newToken);

    /**
     * 判断登录是否过期
     *
     * @param idInfo 访问令牌
     * @return 过期返回true；否则false
     */
    boolean isLogin(TokenIdInfo idInfo);
}
